package com.example.springsecurity.common;


import cn.hutool.core.bean.BeanUtil;
import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONObject;
import com.example.springsecurity.common.utils.ServletUtils;
import com.example.springsecurity.entity.SystemMenu;
import com.example.springsecurity.common.vo.SystemMenuListVo;
import com.example.springsecurity.common.vo.login.Meta;
import com.example.springsecurity.common.vo.login.SystemMenuTreeVo;
import com.example.springsecurity.common.vo.login.SystemMenuVo;
import jakarta.servlet.http.HttpServletRequest;
import org.apache.commons.lang3.StringUtils;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import static com.example.springsecurity.common.constant.Constant.STRING_ZERO;
import static com.example.springsecurity.common.constant.Constant.USER_AGENT;

/**
 * @Description：项目公共方法类
 * @Author： fengcheng
 * @Date： 2024/12/16 13:55
 */
public class CommonMethod {

    /**
     * @Description：从request中解析参数后放入map中并返回
     * @Author：fengcheng
     * @Date：2024/12/16 16:34
     * @Param：request
     * @ParamsType：[javax.servlet.http.HttpServletRequest]
     * @Return：java.util.Map<java.lang.String,java.lang.String>
     */
    public static Map<String, String> getParameterMap(HttpServletRequest request) {
        Map<String, String[]> parameterMap = request.getParameterMap();
        System.out.println(JSONObject.toJSONString(parameterMap));
        return null;
    }

    /**
     * @Description：从请求对象中获取远程ip地址
     * @Author：fengcheng
     * @Date：2025/1/17 11:14
     * @Param：request
     * @ParamsType：[jakarta.servlet.http.HttpServletRequest]
     * @Return：java.lang.String
     */
    public static String getRemoteId(HttpServletRequest request) {
        String ip = ServletUtils.getClientIP(request);
        String ua = request.getHeader(USER_AGENT);
        if (StringUtils.isNotBlank(ip)) {
            return ip + ua;
        }
        return request.getRemoteAddr() + ua;
    }

    /**
     * @Description：List<SystemMenu>【转为】List<SystemMenuVo>
     * @Author：fengcheng
     * @Date：2025/1/17 11:15
     * @Param：resources
     * @ParamsType：[java.util.List<com.example.springsecurity.entity.SystemMenu>]
     * @Return：java.util.List<com.example.springsecurity.vo.login.SystemMenuVo>
     */
    public static List<SystemMenuVo> convertSysResourceToMenuVO(List<SystemMenu> resources) {
        List<SystemMenuVo> menuVOList = new ArrayList<>();
        resources.forEach(item -> {
            SystemMenuVo systemMenuVo = new SystemMenuVo();
            BeanUtil.copyProperties(item, systemMenuVo, false);
            menuVOList.add(systemMenuVo);
        });
        return menuVOList;
    }

    /**
     * @Description：List<SystemMenu>【转为】List<SystemMenuListVo>
     * @Author：fengcheng
     * @Date：2025/1/17 11:16
     * @Param：systemMenus
     * @ParamsType：[java.util.List<com.example.springsecurity.entity.SystemMenu>]
     * @Return：java.util.List<com.example.springsecurity.vo.SystemMenuListVo>
     */
    public static List<SystemMenuListVo> convertSysResourceToMenuListVO(List<SystemMenu> systemMenus) {
        List<SystemMenuListVo> menuVOList = new ArrayList<>();
        systemMenus.forEach(item -> {
            String meta = item.getMeta();
            SystemMenuListVo systemMenuVo = new SystemMenuListVo();
            BeanUtil.copyProperties(item, systemMenuVo, "meta");
            systemMenuVo.setMeta(JSON.to(Meta.class, meta));
            menuVOList.add(systemMenuVo);
        });
        return menuVOList;
    }

    /**
     * @Description：List<SystemMenuVo>【转为】List<SystemMenuTreeVo>，最终转为父子结构的集合数据
     * @Author：fengcheng
     * @Date：2025/1/17 11:17
     * @Param：sysMenuRespList
     * @ParamsType：[java.util.List<com.example.springsecurity.vo.login.SystemMenuVo>]
     * @Return：java.util.List<com.example.springsecurity.vo.login.SystemMenuTreeVo>
     */
    public static List<SystemMenuTreeVo> buildSystemMenuTreeVo(List<SystemMenuVo> sysMenuRespList) {
        Map<String, SystemMenuVo> map = new HashMap<>();
        // 先将所有资源按照父节点ID进行分组
        for (SystemMenuVo menuVo : sysMenuRespList) {
            menuVo.setChildren(new ArrayList<>()); // 初始化children属性
            map.put(menuVo.getId(), menuVo);
            // 如果是根节点则直接加入结果列表
            if (STRING_ZERO.equals(menuVo.getParentId())) {
                map.put(menuVo.getId(), menuVo);
            } else {
                // 如果不是根节点，则加入父节点的 children 列表
                SystemMenuVo parent = map.get(menuVo.getParentId());
                if (parent != null) {
                    parent.getChildren().add(buildMenuTree(menuVo));
                }
            }
        }
        // 获取所有根节点并返回
        List<SystemMenuTreeVo> result = new ArrayList<>();
        for (SystemMenuVo menuVo : sysMenuRespList) {
            if (STRING_ZERO.equals(menuVo.getParentId())) {
                SystemMenuTreeVo systemMenuTreeVo = buildMenuTree(menuVo);
                result.add(systemMenuTreeVo);
            }
        }
        return result;
    }

    /**
     * @Description：构建【SystemMenuTreeVo】对象
     * @Author：fengcheng
     * @Date：2025/1/17 11:18
     * @Param：systemMenuVo
     * @ParamsType：[com.example.springsecurity.vo.login.SystemMenuVo]
     * @Return：com.example.springsecurity.vo.login.SystemMenuTreeVo
     */
    public static SystemMenuTreeVo buildMenuTree(SystemMenuVo systemMenuVo) {
        String component = systemMenuVo.getComponent();
        SystemMenuTreeVo systemMenuTreeVo = new SystemMenuTreeVo();
        systemMenuTreeVo.setName(systemMenuVo.getRouteName());
        systemMenuTreeVo.setPath(systemMenuVo.getPath());
        systemMenuTreeVo.setComponent(component);
        systemMenuTreeVo.setMeta(JSON.to(Meta.class, systemMenuVo.getMeta()));
        systemMenuTreeVo.setChildren(systemMenuVo.getChildren());
        Meta m = new Meta();
        return systemMenuTreeVo;
    }
}
